#include <iostream>
#include <signal.h>
#include <unistd.h>

using namespace std;
void PrintPending(const sigset_t& pending)
{
    for(int signo = 31; signo >= 1; signo--)
    {
        cout << sigismember(&pending, signo);
    }
    cout << endl << endl;
}
void handler(int signo)
{
    cout << "catch a signo:" << signo << endl;
    //exit(1);
}

int main()
{
    sigset_t bset, oset;
    sigemptyset(&bset);
    sigemptyset(&oset);

    for(int i = 1; i <= 31; i++)
    {
        sigaddset(&bset, i);
    }
    sigprocmask(SIG_SETMASK, &bset, &oset);
    sigset_t pending;
    while(true)
    {
        int n = sigpending(&pending);
        if(n < 0) continue;
        PrintPending(pending);
        sleep(1);
    }
}

// int main()
// {
//     signal(2, handler);

//     //1.先对2号信号进行屏蔽
//     sigset_t bset, oset;
//     sigemptyset(&bset);
//     sigaddset(&bset, 2);  //此时还没有设置进入到进程的task_struct

//     //调用系统调用，将数据设置进内核
//     sigprocmask(SIG_SETMASK, &bset, &oset);//屏蔽了2号信号了

//     //2.重复打印当前进程的pending 000000000000000
//     //发送2号信号， 变为00000000000000010
    
//     sigset_t pending;
//     int cnt = 0;
//     while(true)
//     {
//         //获取
//         int n = sigpending(&pending);
//         //打印
//         if(n < 0) continue;
//         PrintPending(pending);
//         sleep(1);
//         cnt++;
//         //解除屏蔽
//         if(cnt == 20)
//         {
//             cout << "unblock 2 signo" << endl;
//             sigprocmask(SIG_SETMASK, &oset, nullptr);
//         }
//     }

//     return 0;
// }